java.lang.reflect
প্যাকেজের Constructor
ক্লাসটি একটি বিশেষ ভূমিকা পালন করে, যা আপনাকে ডাইনামিকভাবে ক্লাসের কনস্ট্রাক্টর অ্যাক্সেস করতে এবং নতুন অবজেক্ট তৈরি করতে সহায়তা করে। রিফ্লেকশন ব্যবহারের মাধ্যমে আপনি এমন কনস্ট্রাক্টর অ্যাক্সেস করতে পারেন যা সাধারনত সাধারণ কোডে অ্যাক্সেস করা সম্ভব নয় (যেমন প্রাইভেট কনস্ট্রাক্টর)। এছাড়া, এটি বিভিন্ন ধরনের কনস্ট্রাক্টরকেও সমর্থন করে, যেমন প্যারামিটারাইজড কনস্ট্রাক্টর।
জাভাতে দুটি প্রধান মেথড রয়েছে, যা কনস্ট্রাক্টর অ্যাক্সেস ও ইনভোকেশন করতে ব্যবহৃত হয়:
getConstructor()
মেথডটি শুধুমাত্র পাবলিক কনস্ট্রাক্টরগুলি অ্যাক্সেস করতে ব্যবহৃত হয়। এটি নির্দিষ্ট প্যারামিটার টাইপের কনস্ট্রাক্টর ফিরে দেয়। যদি আপনি কোনো প্যারামিটার ছাড়া কনস্ট্রাক্টর চান তবে আপনি এটি ব্যবহার করতে পারেন।
Syntax:
public Constructor<T> getConstructor(Class<?>... parameterTypes)
Return Value: এটি একটি Constructor
অবজেক্ট রিটার্ন করে যা নির্দিষ্ট কনস্ট্রাক্টরের ডেটা ধারণ করে।
getDeclaredConstructor()
মেথডটি ক্লাসের সব কনস্ট্রাক্টর (পাবলিক, প্রাইভেট, প্রটেক্টেড) অ্যাক্সেস করতে ব্যবহৃত হয়। এটি আপনাকে কনস্ট্রাক্টরের অ্যাক্সেস বাড়ানোর জন্য setAccessible(true)
মেথডও ব্যবহার করতে পারে, বিশেষ করে যখন কনস্ট্রাক্টর প্রাইভেট বা প্রটেক্টেড হয়।
Syntax:
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Return Value: এটি একটি Constructor
অবজেক্ট রিটার্ন করে যা আপনার দেওয়া প্যারামিটার টাইপের কনস্ট্রাক্টরকে প্রতিনিধিত্ব করে।
কনস্ট্রাক্টর ইনভোকেশন করতে newInstance()
মেথড ব্যবহার করা হয়। এটি কনস্ট্রাক্টরকে কল করে নতুন অবজেক্ট তৈরি করে।
Syntax:
T newInstance(Object... initargs)
Return Value: এটি নতুন তৈরি করা অবজেক্ট রিটার্ন করে।
setAccessible(true)
ব্যবহৃত হয়।এখানে একটি উদাহরণ দেওয়া হলো যেখানে getConstructor()
এবং getDeclaredConstructor()
ব্যবহার করা হয়েছে কনস্ট্রাক্টর অ্যাক্সেস এবং ইনভোকেশন করার জন্য।
import java.lang.reflect.*;
class Person {
private String name;
// পাবলিক কনস্ট্রাক্টর
public Person(String name) {
this.name = name;
}
// প্রাইভেট কনস্ট্রাক্টর
private Person() {
this.name = "Unknown";
}
public void displayName() {
System.out.println("Name: " + name);
}
}
public class ConstructorExample {
public static void main(String[] args) throws Exception {
// 1. পাবলিক কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি
Class<?> cls = Person.class;
Constructor<?> publicConstructor = cls.getConstructor(String.class);
Person person1 = (Person) publicConstructor.newInstance("John");
// displayName() মেথড কল
person1.displayName();
// 2. প্রাইভেট কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি
Constructor<?> privateConstructor = cls.getDeclaredConstructor();
privateConstructor.setAccessible(true); // প্রাইভেট কনস্ট্রাক্টর অ্যাক্সেস করার জন্য
Person person2 = (Person) privateConstructor.newInstance();
// displayName() মেথড কল
person2.displayName();
}
}
cls.getConstructor(String.class)
মেথড ব্যবহার করে Person
ক্লাসের পাবলিক কনস্ট্রাক্টরটি পাওয়া যায় যা String
প্যারামিটার নেয়।newInstance()
মেথডের মাধ্যমে Person
অবজেক্ট তৈরি করা হয় এবং তার displayName()
মেথড কল করা হয়।cls.getDeclaredConstructor()
মেথড ব্যবহার করে Person
ক্লাসের প্রাইভেট কনস্ট্রাক্টরটি পাওয়া যায়। কারণ এটি প্রাইভেট, তাই setAccessible(true)
ব্যবহার করা হয়েছে।newInstance()
মেথড দিয়ে নতুন অবজেক্ট তৈরি করা হয় এবং displayName()
মেথড কল করা হয়।getDeclaredConstructor()
মেথড এবং setAccessible(true)
ব্যবহার করে আপনি প্রাইভেট কনস্ট্রাক্টরেও অ্যাক্সেস পেতে পারেন।getConstructor()
এবং getDeclaredConstructor()
মেথডগুলো জাভা রিফ্লেকশন প্যাকেজের গুরুত্বপূর্ণ অংশ, যা ডাইনামিকভাবে কনস্ট্রাক্টর অ্যাক্সেস এবং ইনভোকেশন করতে সাহায্য করে। এগুলি বিশেষ করে সেই পরিস্থিতিতে কার্যকর যেখানে আপনি রানটাইমে নতুন অবজেক্ট তৈরি করতে চান এবং আপনি কনস্ট্রাক্টরের প্যারামিটার বা অ্যাক্সেস মডিফায়ার সম্পর্কে পূর্বানুমান করতে পারছেন না। তবে, সেগুলির পারফরম্যান্স এবং সিকিউরিটি বিষয়ক সীমাবদ্ধতাও রয়েছে।
Read more